typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;
// 队列的结构 
typedef struct Queue
{
	QNode* front;
	QNode* rear;
}Queue;
// 初始化队列 
void QueueInit(Queue* q)
{
	assert(q);
	q->front = NULL;
	q->rear = NULL;
}
// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
	if (q->front == NULL)
	{
		QNode* newnode = (QNode*)malloc(sizeof(QNode));
		newnode->next = NULL;
		newnode->data = data;
		q->front = newnode;
		q->rear = newnode;
	}
	else
	{
		QNode* newnode = (QNode*)malloc(sizeof(QNode));
		newnode->next = NULL;
		newnode->data = data;
		q->rear->next = newnode;
		q->rear = q->rear->next;
	}
}
// 队头出队列 
void QueuePop(Queue* q)
{
	assert(q);
	assert(q->front);
	QNode* erase = q->front;
	q->front = q->front->next;
	if (q->rear == erase)
	{
		q->rear = NULL;
	}
	free(erase);
}
// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(q->front);
	return q->front->data;
}
// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->front);
	return q->rear->data;
}
// 检测队列是否为空，如果为空返回非零结果，如果非空返回0 
int QueueEmpty(Queue* q)
{
	if (q->front == NULL)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
// 销毁队列 
void QueueDestroy(Queue* q)
{
	while (q->front)
	{
		QNode* erase = q->front;
		q->front = q->front->next;
		free(erase);
	}
	q->rear = NULL;
}
//栈的结构定义
typedef struct {
    Queue* queue1;
    Queue* queue2;
} MyStack;
//栈的创建
MyStack* myStackCreate() {
    MyStack* tmp=(MyStack*)malloc(sizeof(MyStack));
    tmp->queue1=(Queue*)malloc(sizeof(Queue));
    tmp->queue2=(Queue*)malloc(sizeof(Queue));
    QueueInit(tmp->queue1);
    QueueInit(tmp->queue2);
    return tmp;
}
//栈的插入
void myStackPush(MyStack* obj, int x) {
    if(QueueEmpty(obj->queue2))
    QueuePush(obj->queue1,x);
    else
    QueuePush(obj->queue2,x);
}
//栈的删除
int myStackPop(MyStack* obj) {
    assert(!QueueEmpty(obj->queue1)||!QueueEmpty(obj->queue2));
    if(QueueEmpty(obj->queue1))
    {
        while(obj->queue2->front!=obj->queue2->rear)
        {
            QDataType tmp=QueueFront(obj->queue2);
            QueuePop(obj->queue2);
            QueuePush(obj->queue1,tmp);
        }
        QDataType ret=QueueFront(obj->queue2);
        QueuePop(obj->queue2);
        return ret;
    }
    else
    {
        while(obj->queue1->front!=obj->queue1->rear)
        {
            QDataType tmp=QueueFront(obj->queue1);
            QueuePop(obj->queue1);
            QueuePush(obj->queue2,tmp);
        }
        QDataType ret=QueueFront(obj->queue1);
        QueuePop(obj->queue1);
        return ret;
    }
}
//获取栈顶元素
int myStackTop(MyStack* obj) {
    assert(!QueueEmpty(obj->queue1)||!QueueEmpty(obj->queue2));
    if(QueueEmpty(obj->queue1))
    {
        while(obj->queue2->front!=obj->queue2->rear)
        {
            QDataType tmp=QueueFront(obj->queue2);
            QueuePop(obj->queue2);
            QueuePush(obj->queue1,tmp);
        }
        QDataType ret=QueueFront(obj->queue2);
        QueuePop(obj->queue2);
        QueuePush(obj->queue1,ret);
        return ret;
    }
    else
    {
        while(obj->queue1->front!=obj->queue1->rear)
        {
            QDataType tmp=QueueFront(obj->queue1);
            QueuePop(obj->queue1);
            QueuePush(obj->queue2,tmp);
        }
        QDataType ret=QueueFront(obj->queue1);
        QueuePop(obj->queue1);
        QueuePush(obj->queue2,ret);
        return ret;
    }
}
//栈的判空
bool myStackEmpty(MyStack* obj) {
    if(QueueEmpty(obj->queue1)&&QueueEmpty(obj->queue2))
    return true;
    return false;
}
//栈的销毁
void myStackFree(MyStack* obj) {
    QueueDestroy(obj->queue1);
    QueueDestroy(obj->queue2);
    free(obj);
}